package com.lncg.util;

import com.lncg.entity.DeviceReceiveData;
import com.lncg.entity.CqzlDeviceReceiveData;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.nio.charset.StandardCharsets;

/**
 * CQZL协议解析器 - 专门解析CQZL协议的JSON数据
 * 
 * 提供CQZL协议的解析功能，支持将JSON数据转换为CQZL专用实体对象。
 * 同时保持对原有DeviceReceiveData实体的兼容性。
 * 
 * @author LNCG
 * @version 1.1.0
 * @since 2024-10-17
 */
@Component
public class CqzlProtocolParser {
    
    private static final Logger logger = LoggerFactory.getLogger(CqzlProtocolParser.class);
    
    /**
     * 解析CQZL协议数据
     * @param jsonBytes JSON字节数组
     * @return 解析后的设备数据对象
     */
    public DeviceReceiveData parseCqzlProtocol(byte[] jsonBytes) {
        try {
            ObjectMapper mapper = new ObjectMapper();
            String jsonString = new String(jsonBytes, StandardCharsets.UTF_8);
            JsonNode jsonNode = mapper.readTree(jsonString);
            
            DeviceReceiveData deviceData = new DeviceReceiveData();
            
            // 解析IMEI
            if (jsonNode.has("imei")) {
                deviceData.setImei(jsonNode.get("imei").asText());
            }
            
            // 解析ICCID
            if (jsonNode.has("iccid")) {
                deviceData.setSim(jsonNode.get("iccid").asText());
            }
            
            // 解析电池电压
            if (jsonNode.has("vbat")) {
                double vbat = jsonNode.get("vbat").asDouble();
                // 转换为整数（毫伏）
                deviceData.setBatteryVoltage(String.valueOf((int)(vbat * 1000)));
            }
            
            // 解析信号强度
            if (jsonNode.has("csq")) {
                deviceData.setSignalLevel(jsonNode.get("csq").asInt());
            }
            
            // 解析正累计数据 - CQZL协议优先使用浮点数据
            if (jsonNode.has("zhengleiji")) {
                // CQZL协议：使用浮点数据
                double zhengLeiji = jsonNode.get("zhengleiji").asDouble();
                deviceData.setPositiveData(String.valueOf((int)(zhengLeiji * 1000))); // 转换为整数
                logger.debug("CQZL协议正累计数据: {}", zhengLeiji);
            } else if (jsonNode.has("DI_COUNT1")) {
                // 备用：使用整数数据
                deviceData.setPositiveData(String.valueOf(jsonNode.get("DI_COUNT1").asInt()));
                logger.debug("CQZL协议备用正累计数据: {}", jsonNode.get("DI_COUNT1").asInt());
            }
            
            // 解析负累计数据 - CQZL协议优先使用浮点数据
            if (jsonNode.has("fuleiji")) {
                // CQZL协议：使用浮点数据
                double fuLeiji = jsonNode.get("fuleiji").asDouble();
                deviceData.setNegativeData(String.valueOf((int)(fuLeiji * 1000))); // 转换为整数
                logger.debug("CQZL协议负累计数据: {}", fuLeiji);
            } else if (jsonNode.has("DI_COUNT2")) {
                // 备用：使用整数数据
                deviceData.setNegativeData(String.valueOf(jsonNode.get("DI_COUNT2").asInt()));
                logger.debug("CQZL协议备用负累计数据: {}", jsonNode.get("DI_COUNT2").asInt());
            }
            
            // 设置CQZL协议固定值
            deviceData.setInstructionType(1); // 数据上报
            deviceData.setCommMethod(1); // 通信方式
            deviceData.setUnitCode(1); // 计量单位
            deviceData.setDeviceType(1); // 设备类型
            deviceData.setCaliberCode(1); // 口径
            deviceData.setProtocolVer(1); // 协议版本
            deviceData.setOnlineState(1); // 在线状态
            deviceData.setOnlineInterval("01"); // 上线间隔
            deviceData.setRetryCount(1); // 重发次数
            deviceData.setMeterStatus(1); // 表具状态
            deviceData.setRawFrame(jsonString); // 保存原始JSON数据
            
            // 生成指令ID（基于时间戳）
            if (jsonNode.has("ts")) {
                long ts = jsonNode.get("ts").asLong();
                deviceData.setInstructionId(String.format("%010d", ts % 10000000000L));
            }
            
            logger.info("CQZL协议解析成功 IMEI:{}", deviceData.getImei());
            return deviceData;
            
        } catch (Exception e) {
            logger.error("CQZL协议解析失败: {}", e.getMessage(), e);
            throw new RuntimeException("CQZL协议解析失败", e);
        }
    }
    
    /**
     * 检测是否为CQZL协议
     * @param data 数据字节数组
     * @return true如果是CQZL协议
     */
    public boolean isCqzlProtocol(byte[] data) {
        if (data == null || data.length == 0) {
            return false;
        }
        
        try {
            // 检查是否为JSON格式
            if (data[0] != 0x7B) { // 不以{开头
                return false;
            }
            
            String jsonString = new String(data, StandardCharsets.UTF_8);
            ObjectMapper mapper = new ObjectMapper();
            JsonNode jsonNode = mapper.readTree(jsonString);
            
            // 检测CQZL协议特征字段
            return jsonNode.has("fuleiji") || jsonNode.has("zhengleiji") || jsonNode.has("shunshi") ||
                   jsonNode.has("upkey") || jsonNode.has("ipport") || jsonNode.has("softtime");
            
        } catch (Exception e) {
            logger.debug("CQZL协议检测失败: {}", e.getMessage());
            return false;
        }
    }
    
    /**
     * 解析CQZL协议数据为专用实体对象
     * 
     * 将CQZL协议的JSON数据解析为CqzlDeviceReceiveData实体对象，
     * 用于直接存储到CQZL专用数据表中。
     * 
     * @param jsonBytes JSON字节数组
     * @return CQZL专用设备数据对象
     */
    public CqzlDeviceReceiveData parseCqzlDataToEntity(byte[] jsonBytes) {
        try {
            ObjectMapper mapper = new ObjectMapper();
            String jsonString = new String(jsonBytes, StandardCharsets.UTF_8);
            JsonNode jsonNode = mapper.readTree(jsonString);
            
            CqzlDeviceReceiveData deviceData = new CqzlDeviceReceiveData();
            
            // 解析上传标识
            if (jsonNode.has("upkey")) {
                deviceData.setUpkey(jsonNode.get("upkey").asText());
            }
            
            // 解析IMEI
            if (jsonNode.has("imei")) {
                deviceData.setImei(jsonNode.get("imei").asText());
            }
            
            // 解析ICCID（SIM卡号）
            if (jsonNode.has("iccid")) {
                deviceData.setIccid(jsonNode.get("iccid").asText());
            }
            
            // 解析信号质量
            if (jsonNode.has("csq")) {
                deviceData.setCsq(jsonNode.get("csq").asText());
            }
            
            // 解析电池电压
            if (jsonNode.has("vbat")) {
                deviceData.setVbat(jsonNode.get("vbat").asText());
            }
            
            // 解析时间戳
            if (jsonNode.has("ts")) {
                deviceData.setTs(jsonNode.get("ts").asText());
            }
            
            // 解析正累计值
            if (jsonNode.has("zhengleiji")) {
                deviceData.setZhengleiji(jsonNode.get("zhengleiji").asText());
            }
            
            // 解析负累计值
            if (jsonNode.has("fuleiji")) {
                deviceData.setFuleiji(jsonNode.get("fuleiji").asText());
            }
            
            // 解析瞬时值
            if (jsonNode.has("shunshi")) {
                deviceData.setShunshi(jsonNode.get("shunshi").asText());
            }
            
            // 解析数字输入计数 - 支持大写和小写字段名
            if (jsonNode.has("DI_COUNT1")) {
                deviceData.setDiCount1(jsonNode.get("DI_COUNT1").asText());
            } else if (jsonNode.has("di_count1")) {
                deviceData.setDiCount1(jsonNode.get("di_count1").asText());
            }
            
            if (jsonNode.has("DI_COUNT2")) {
                deviceData.setDiCount2(jsonNode.get("DI_COUNT2").asText());
            } else if (jsonNode.has("di_count2")) {
                deviceData.setDiCount2(jsonNode.get("di_count2").asText());
            }
            
            if (jsonNode.has("DI_COUNT3")) {
                deviceData.setDiCount3(jsonNode.get("DI_COUNT3").asText());
            } else if (jsonNode.has("di_count3")) {
                deviceData.setDiCount3(jsonNode.get("di_count3").asText());
            }
            
            // 保存原始数据
            deviceData.setRawdata(jsonString);
            
            logger.info("CQZL协议解析为专用实体成功 IMEI:{}", deviceData.getImei());
            return deviceData;
            
        } catch (Exception e) {
            logger.error("CQZL协议解析为专用实体失败: {}", e.getMessage(), e);
            throw new RuntimeException("CQZL协议解析为专用实体失败", e);
        }
    }
    
    /**
     * 解析CQZL协议数据为专用实体对象（字符串版本）
     * 
     * @param jsonString JSON字符串
     * @return CQZL专用设备数据对象
     */
    public CqzlDeviceReceiveData parseCqzlDataToEntity(String jsonString) {
        return parseCqzlDataToEntity(jsonString.getBytes(StandardCharsets.UTF_8));
    }
    
    /**
     * 获取CQZL协议扩展字段信息
     * @param jsonBytes JSON字节数组
     * @return CQZL扩展信息字符串
     */
    public String getCqzlExtendedInfo(byte[] jsonBytes) {
        try {
            String jsonString = new String(jsonBytes, StandardCharsets.UTF_8);
            ObjectMapper mapper = new ObjectMapper();
            JsonNode jsonNode = mapper.readTree(jsonString);
            
            StringBuilder info = new StringBuilder();
            info.append("CQZL扩展信息: ");
            
            if (jsonNode.has("shunshi")) {
                info.append("瞬时数据=").append(jsonNode.get("shunshi").asDouble()).append(" ");
            }
            if (jsonNode.has("upkey")) {
                info.append("上传键=").append(jsonNode.get("upkey").asText()).append(" ");
            }
            if (jsonNode.has("ipport")) {
                info.append("IP端口=").append(jsonNode.get("ipport").asText()).append(" ");
            }
            if (jsonNode.has("softtime")) {
                info.append("软件时间=").append(jsonNode.get("softtime").asText()).append(" ");
            }
            if (jsonNode.has("id")) {
                info.append("数据ID=").append(jsonNode.get("id").asInt());
            }
            
            return info.toString();
            
        } catch (Exception e) {
            return "CQZL扩展信息解析失败: " + e.getMessage();
        }
    }
}
